package xserver

import (
	"context"
	"gitee.com/xiedongji/antgo/core"
	"gitee.com/xiedongji/antgo/cpts/xcfg"
	"gitee.com/xiedongji/antgo/cpts/xlog"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

var (
	webHttpServerHandler *http.Server
)

/* ====================================================================== *
 * 功能:启动 Gin Http 服务
 * 描述:router 类型为 gin.Engine 中实现了 ServeHTTP 所以可以赋值给 Handler
 * ====================================================================== */
func NewWebHttpServer() *gin.Engine {
	// 设置运行模式
	gin.SetMode(core.RunEnv)
	engine := gin.New()
	return engine
}

/* ====================================================================== *
 * 功能:启动 Gin Http 服务
 * 描述:router 类型为 gin.Engine 中实现了 ServeHTTP 所以可以赋值给 Handler
 * ====================================================================== */
func WebHttpServerRun(routerHandler *gin.Engine) {
	// 生成一个 http 服务
	webHttpServerHandler = &http.Server{
		Addr:           xcfg.GetString("http.host"),
		Handler:        routerHandler,
		ReadTimeout:    time.Duration(xcfg.GetInt("http.read_timeout")) * time.Second,  // 上次 由于没有  * time.Second 导致 请求报错 socket hang up 和 read ECONNRESET
		WriteTimeout:   time.Duration(xcfg.GetInt("http.write_timeout")) * time.Second, // 上次 由于没有  * time.Second 导致 请求报错 socket hang up 和 read ECONNRESET
		MaxHeaderBytes: 1 << uint(xcfg.GetInt("http.max_header_bytes")),
	}

	go func() {
		xlog.Logger(core.AppLogName, "web").Info().Str("监听地址", xcfg.GetString("http.host")).Str("运行模式", gin.Mode()).Msg("HTTP服务 启动-------->")
		if err := webHttpServerHandler.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			xlog.Logger(core.AppLogName, "web").Warn().Str("监听地址", xcfg.GetString("http.host")).Err(err).Msg("HTTP服务 关闭!-------->")
		}
	}()
}

/* ====================================================================== *
 * 功能:关闭 Gin Http 服务
 * ====================================================================== */
func WebHttpServerStop() {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	if err := webHttpServerHandler.Shutdown(ctx); err != nil {
		xlog.Logger(core.AppLogName, "web").Warn().Err(err).Msg("HTTP服务 关闭完成!-------->")
	}
	xlog.Logger(core.AppLogName, "web").Info().Msg("HTTP服务 关闭完成!-------->")
}
